#!/bin/bash
. httputil

#手机或飞信号
sid=""
passwd=""

# ----------------- define ----------------------
#用于自己id和昵称
declare selfNickname
declare selfId

playSound() {
	mplayer msg.wav > /dev/null 2>&1
}

random() {
	echo -n $(date +"%s%N")
}

# -------------
# 登录
# $1	手机号/飞信号
# $2	密码
# $3	是否使用缓存的Cookies,默认1,使用缓存,0禁用缓存
# 会将自身的昵称,Id分别设置到全局变量 selfNickname,selfId中
login() {
	declare sid="$1"
	declare passwd="$2"
	declare useCache="${3-1}"
	declare url="http://f.10086.cn/im5/user/selfInfo.action?t=$(random)"
	declare loginData
	declare tip
	declare loginState

	if [ $useCache -gt 0 ]; then
		#看缓存是否有效
		echo use cached cookies
		doGet "$url"

		selfNickname=$(getJSONValue "nickname" "$(getResult)")
		selfId=$(getJSONValue "idUser" "$(getResult)")

		test -n "$selfNickname" && echo Welcome, "$selfNickname""(id:$selfId)" && return 0
		echo cache expiry
	fi

	#开始登录
	echo start login...
	url="http://f.10086.cn/im5/login/loginHtml5.action?t=$(random)"
	loginData="m=$sid&pass=$passwd&captchaCode=&checkCodeKey=null"

	#如果请求发送失败
	if ! doPost "$loginData" "$url" ; then
		echo "send Error"
		exit 1
	fi
	tip=$(getJSONValue "tip" "$(getResult)")
	loginState=$(getJSONValue "loginstate" "$(getResult)")

	#判断是否登录成功,如果tip不为"",或loginstate不是200则失败
	#(test -n "$tip" || test 200 -ne "$loginstate") && echo "login state:$loginstate,tip:$tip " && exit 1
	test -n "$tip" || test 200 -ne "$loginState" && echo "login state:$loginState,tip:$tip " && return 1
	selfNickname=$(getJSONValue "nickname" "$(getResult)")
	selfId=$(getJSONValue "idUser" "$(getResult)")
	echo Welcome , "$selfNickname(id:$selfId)"
	return 0
}

# --------- 好友查找 ---------

#通过手机号/飞信号获取用户内部id
# $1 用户手机号/飞信号
# 输出id,如果非法号码则""
getUserId() {
	declare url="http://f.10086.cn/im5/user/searchFriendByPhone.action?number=$1&t=$(random)&_=$(random)"
	doGet "$url"
	declare id=$(getJSONValue "idUser" "$(getResult)")
	#如果id不是""(好友和陌生人)
	test -n "$id" && echo -n "$id" && return

	declare tip=$(getJSONValue "tip" "$(getResult)")
	test "$tip" == "不能加自己为好友" && echo -n "$selfId"
}


# --------- 消息发送----------

#发送即时消息
# $1  用户id,如果是自己提示成功,但是收不到,陌生人貌似也是
# $2  消息内容
sendNewMsg() {
	declare url="http://f.10086.cn/im5/chat/sendNewMsg.action"
	declare data="touserid=$1&msg=$2"

	#echo send Msg: "$data"
	doPost "$data" "$url"
	#getResult
	#echo ""
}

#免费短信发送可以群发(这个只会发送到手机)
# $1 用户id,可以有多个以,分割
# $2 消息内容
sendNewShortMsg() {
	declare url="http://f.10086.cn/im5/chat/sendNewGroupShortMsg.action?t=$(random)"
	declare data="touserid=$1&msg=$2"

	echo send ShortMsg: "$data"
	doPost "$data" "$url"
	getResult
}

# 通过手机/飞信号码发送信息
# 好友发送在线消息,自己/陌生人发送短信息,经测试没有办法给陌生人发送
# $1 手机/飞信号码
# $2 消息内容
sendMsg() {
	declare id=$(getUserId "$1")
	declare msg="$2"
	#如果id为""
	test -z "$id" && echo "手机/飞信号码没有对应的用户" && return

	#这个是请求聊天的URL,可以判断是否是陌生人
	declare url="http://f.10086.cn/im5/chat/toChatMsg.action?t=$(random)"
	doPost "touserid=$id" "$url"
	#不是陌生人 offine可以判断是否离线1/0,1离线
	if [ "N" == $(getJSONValue "isStranger" "$(getResult)") ] ; then
		sendNewMsg "$id" "$msg"
	else
		#自己也被认为是陌生人,则发送短信息到手机
		sendNewShortMsg "$id" "$msg"
	fi
}

# -------------- 消息接收 -----------------

#获取所有消息,对于每个用户只获取一条最新的消息
getAllMsg() {
	declare url="http://f.10086.cn/im5/box/alllist.action?t=$(random)"
	doPost '' "$url"
	if [ -n "$(getResult)" ]; then
		#将消息处理挂到后台
		#分割出来每一条消息 ?????????????????????????????????这没有分割有问题
		#awk -F "}\s*,\s*{" '{ for(i=1;i<=NF;i++) { print $i }}' "$json"
		#exit
		msgHandler "$(getResult)"
	fi
	sleep 2
	getAllMsg
}

#处理单条消息
msgHandler() {
	playSound &
	declare msg="$1"
	test -z "$msg" && return 1

	declare idMsg=$(getJSONValue "idMessage" "$msg")
	declare nickname=$(getJSONValue "fromNickname" "$msg")
	declare id=$(getJSONValue "fromIdUser" "$msg")
	declare sendTime=$(getJSONValue "sendTime" "$msg")
	msg=$(getJSONValue "message" "$msg")
	#显示消息
	cat << EOF
-------------------------------------------
  消息Id:$idMsg
  $nickname(内部Id:$id) $sendTime
  ${msg//\\u0026/&}
EOF

	#标记消息为已读
	markMsg $idMsg &
	reply "$id"
	return 0
}

#标记指定消息已读,以后不会再接收到,否则还会接收到
# $1 消息的id
markMsg() {
	declare idMsgs="$1"
	declare url="http://f.10086.cn/im5/chat/queryNewMsg.action?idMsgs=$idMsgs&t=$(random)&_=$(random)"
	doGet "$url"
	#{"returnCode":200}
}

reply() {
	declare id="$1"

	cat << EOF
  ----              回复 $fromNickname(输入|自动结束输入):
EOF
	#read -p "  " _msg
	#30秒超时,设置分隔符为中文字符避免按键终止,读到输入EOF
	read -t 30 -d '|' -p "  " _msg
	#_msg="嗯嗯"
	echo ""
	echo "                            "$(date +"%Y-%m-%d %T")
	echo -n "  "
	sendNewMsg "$id" "$_msg"
}


# ----------- logic -----------------
#登录使用缓存
#login
tmp_login() {
	login "$sid" "$passwd" 1
	echo -----------------------------------------
}

#发送模式,发送后退出
if [ "$1" == "-s" ] && [ $# -eq 3 ]; then
	tmp_login
	sendMsg "$2" "$3"
	echo ""
	echo "Over ..."
	exit
#骚扰模式
elif [ "$1" == "-l" ] && [ $# -eq 4 ]; then
	tmp_login
	for((i=1;i<=$2;i++)); do
		echo "发送第$i条...."
		sendMsg "$3" "$4"
	done
	echo "Over ..."
	exit
#聊天模式
elif [ $# -eq 0 ]; then
	tmp_login
	echo "获取消息..."
	echo -n "  "
	getAllMsg
	exit
fi

cat << EOF
send mode: $(basename "$0") -s mobile/fetionNo msg
love mode: $(basename "$0") -l count mobile/fetionNo msg
chat mode: $(basename "$0")
EOF
